/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

// 查询一颗树里面子树的结构是否和一颗树相同
// 这个问题可以使用6相同的树的思想
// 我们可以设置一个递归,遍历树
// 当树里面出现的某个节点和需要查找的树的头结点一样的时候,我们可以比对从该节点开始是否和查找树的值相同
// 如果不同就继续向下寻找,知道寻找到查找完所有的节点,如果没有就返回假
// 如果中途有任何一个结构的值符合的话,就会直接中止递归然后返回真

bool isSameTree (struct TreeNode* root, struct TreeNode* subRoot)
{

    if (root == NULL && subRoot == NULL)
    {

        return true ;

    }

    if (root == NULL || subRoot == NULL)
    {

        return false ;

    }

    if (root -> val != subRoot -> val)
    {

        return false ;

    }

    return isSameTree (root -> left , subRoot -> left) && isSameTree (root -> right , subRoot -> right) ;

}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) 
{

    if (root == NULL)
    {

        return false ;

    }

    if (isSameTree (root , subRoot))
    {

        return true ;

    }

    return isSubtree (root -> left , subRoot) || isSubtree (root -> right , subRoot) ;
    
}